package base.thread_demo.demo20;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.IntUnaryOperator;

public class TestAtomicDemo1 {

    public static void main(String[] args) {
        AtomicInteger i = new AtomicInteger(5);
        //1、API使用
//		System.out.println(i.updateAndGet(x -> x*10));//50
		/*2、 API使用
		System.out.println(i.getAndUpdate(x -> x*10));//5
		System.out.println(i.get());//50
		System.out.println(i.get());//50
		*/

        //3、模拟 updateAndGet 的原子操作，封装成一个方法
        System.out.println(updateAndGet(i, p->p*10));


    }

    /*
     * 通过java.util.function.IntUnaryOperator 接口，封装操作，
     * 不要将操作prev - 10写死在内部，因为这样就只能对一种操作（乘法）进行原子操作，
     * 这样我就可以将这个方法可以对加法、减法、除法统一通过这个方法进行调用
     */
    public static int updateAndGet(AtomicInteger i, IntUnaryOperator functionOperator) {
        while(true) {
            int prev = i.get();
//			int next = prev * 10;
            int next = functionOperator.applyAsInt(prev);
            if(i.compareAndSet(prev, next)) {//如果AtomicInteger对象的value的最新值和prev比较相等(说明别的线程还没有修改)，则用next设置为AtomicInteger对象的value值，退出循环尝试修改操作
//				break;
                return next;
            }
        }
    }

}

